package com.lhn.netty.nio;

import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @author lhn
 * @date 2025/05/26 20:10
 * @since 1.0.0
 **/
// 使用 MappedByteBuffer 将文件的一部分直接映射到内存（堆外内存），实现零拷贝式文件修改
public class MappedByByteBufferTest {

    public static void main(String[] args) throws Exception {
        // 随机读写文件流
        RandomAccessFile randomAccessFile = new RandomAccessFile("1.txt", "rw");

        // 获取文件通道
        FileChannel accessFileChannel = randomAccessFile.getChannel();

        /**
         * 参数1: MapMode.READ_WRITE - 映射为读写模式
         * 参数2: 映射的起始位置（偏移量）
         * 参数3: 映射的大小（字节数） - 表示将文件中多少字节映射到内存
         *
         * 实际效果：将文件的 [0, 5) 共5个字节映射到堆外内存
         */
        MappedByteBuffer mappedByteBuffer = accessFileChannel.map(FileChannel.MapMode.READ_WRITE, 0, 5);

        // 直接在堆外内存中修改文件内容
        mappedByteBuffer.put(0, (byte) '1');
        mappedByteBuffer.put(3, (byte) '2');

        mappedByteBuffer.force(); // 强制将修改同步到磁盘


        // 关闭资源，数据会在适当时机同步回文件
        randomAccessFile.close();
    }
}
